package de.uniba.dsg.bpmnspector.common.xsdvalidation;
import api.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* validator for the schema validation of wsdl files
*
* @author Philipp Neugebauer
* @author Matthias Geiger
* @version 1.0
*
*/
public class WsdlValidator extends AbstractXsdValidator {
private Schema schema;
private static final Logger LOGGER = LoggerFactory.getLogger(
WsdlValidator.class
.getSimpleName());
{
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
schema = schemaFactory
.newSchema(resolveResourcePaths("wsdl20.xsd"));
} catch (FileNotFoundException | SAXException e) {
LOGGER.debug("schemafactory couldn't create schema, cause: {}", e);
}
}
@Override
public void validateAgainstXsd(File xmlFile,
ValidationResult validationResult)
throws IOException, SAXException, ValidationException {
LOGGER.debug("file based WSDL xsd validation started: {}", xmlFile.getName());
StreamSource src = new StreamSource(xmlFile);
validateUsingStreamSource(src, new Resource(xmlFile.toPath()), validationResult);
}
@Override
public void validateAgainstXsd(InputStream stream, Resource resource, ValidationResult validationResult)
throws IOException, SAXException, ValidationException {
StreamSource src = new StreamSource(stream);
validateUsingStreamSource(src, resource, validationResult);
}
private void validateUsingStreamSource(StreamSource src, Resource resource, ValidationResult validationResult)
throws IOException, SAXException, ValidationException {
List<SAXParseException> xsdErrorList = new ArrayList<>();
Validator validator = schema.newValidator();
validator.setErrorHandler(new XsdValidationErrorHandler(xsdErrorList));
try {
validator.validate(src);
for (SAXParseException saxParseException : xsdErrorList) {
Location location = createLocation(resource, saxParseException.getLineNumber(),
saxParseException.getColumnNumber());
Violation violation = new Violation(location, saxParseException.getMessage(), "WSDL-XSD-Check");
validationResult.addViolation(violation);
LOGGER.info("WSDL xsd violation found in {} at line {}.",
resource.getResourceName(), saxParseException.getLineNumber());
}
} catch (SAXParseException e) {
// if process is not well-formed exception is not processed via the error handler
Location location = createLocation(resource, e.getLineNumber(), e.getLineNumber());
Violation violation = new Violation(location, e.getMessage(), "XSD-Check");
validationResult.addViolation(violation);
String msg = String.format("File %s is not well-formed at line %d: %s", resource.getResourceName(),
e.getLineNumber(), e.getMessage());
LOGGER.info(msg);
throw new ValidationException("Cancel Validation as checked File is not well-formed.");
}
}
}